home *** CD-ROM | disk | FTP | other *** search
- package regex;
-
- import java.util.Hashtable;
-
- class RegExpNFA {
- private Hashtable nfa = new Hashtable();
- private int nfaEntry;
- private int nfaExit;
- private int count = 0;
- private RTree tree;
- private boolean hasLHead = false;
- private boolean hasLTail = false;
- private static final String MSG_INVALID_OPERATION = "Invalid operation.";
-
- public int exit() {
- return this.nfaExit;
- }
-
- public RegExpNFA(RTree var1) throws NFABuildException {
- this.tree = var1;
- this.buildNfa();
- }
-
- private int genNode() throws NFABuildException {
- return this.count++;
- }
-
- private void buildNfa() throws NFABuildException {
- this.nfaEntry = this.genNode();
- this.nfaExit = this.genNode();
- this.genNfa(this.tree, this.nfaEntry, this.nfaExit);
- }
-
- public int entry() {
- return this.nfaEntry;
- }
-
- private void addTransition(int var1, int var2, Chars var3) {
- Integer var4 = new Integer(var1);
- NList var5 = new NList(var3, var2, (NList)this.nfa.get(var4));
- this.nfa.put(var4, var5);
- }
-
- public NList getNList(int var1) {
- Integer var2 = new Integer(var1);
- return (NList)this.nfa.get(var2);
- }
-
- public RTree getTree() {
- return this.tree;
- }
-
- private void genNfa(RTree var1, int var2, int var3) throws NFABuildException {
- switch (var1.operation()) {
- case 0:
- this.addTransition(var2, var3, new Chars(0));
- break;
- case 1:
- this.addTransition(var2, var3, var1.chars());
- break;
- case 2:
- int var6 = this.genNode();
- this.genNfa(var1.left(), var2, var6);
- this.genNfa(var1.right(), var6, var3);
- break;
- case 3:
- this.genNfa(var1.left(), var2, var3);
- this.genNfa(var1.right(), var2, var3);
- break;
- case 4:
- int var4 = this.genNode();
- int var5 = this.genNode();
- this.addTransition(var2, var4, new Chars(0));
- this.genNfa(var1.left(), var4, var5);
- this.addTransition(var5, var4, new Chars(0));
- this.addTransition(var4, var3, new Chars(0));
- break;
- case 5:
- if (var2 != this.nfaEntry) {
- this.addTransition(var2, var3, var1.chars());
- } else {
- this.hasLHead = true;
- this.addTransition(var2, var3, new Chars(2));
- }
- break;
- case 6:
- if (var3 != this.nfaExit) {
- this.addTransition(var2, var3, var1.chars());
- } else {
- this.hasLTail = true;
- this.addTransition(var2, var3, new Chars(3));
- }
- break;
- default:
- throw new NFABuildException("Invalid operation.");
- }
-
- }
-
- public int count() {
- return this.count;
- }
-
- public boolean hasLHead() {
- return this.hasLHead;
- }
-
- public boolean hasLTail() {
- return this.hasLTail;
- }
- }
-